#include "pch.hpp"
#include "Enum.hpp"
#include "Type.hpp"

using namespace Engine;
using namespace Engine::Script;




Enum::Enum(int id, QString name, Values values)
	: m_id(id)
	, m_name(name)
	, m_values(values)
{}
///////////////////////////////////////////////////////////////////////////////////////////////////




int Enum::id() const
{
	return m_id;
}
///////////////////////////////////////////////////////////////////////////////////////////////////

QString Enum::name() const
{
	return m_name;
}
///////////////////////////////////////////////////////////////////////////////////////////////////

int Enum::valueCount() const
{
	return m_values.size();
}
///////////////////////////////////////////////////////////////////////////////////////////////////

QString Enum::name(int index) const
{
	verify(index < valueCount());
	return m_values[index].first;
}
///////////////////////////////////////////////////////////////////////////////////////////////////

int Enum::value(int index) const
{
	verify(index < valueCount());
	return m_values[index].second;
}
///////////////////////////////////////////////////////////////////////////////////////////////////




void Enum::compareState(boostext::iostreams::bin_istream& stream) const
{
	int tmp;
	stream >> tmp;
	if(tmp != id())
		throw invalid_value_exception("enum id doesn't match", tmp);

	QByteArray data;
	QString n;
	stream >> data;
	n = QString::fromUtf8(data.constData(), data.size());
	if(n != name())
		throw invalid_value_exception("enum name doesn't match", tmp);

	stream >> tmp;
	if(tmp != valueCount())
		throw invalid_value_exception("enum count doesn't match", tmp);

	for(int i = 0; i < valueCount(); ++i)
	{
		stream >> data;
		n = QString::fromUtf8(data.constData(), data.size());
		stream >> tmp;

		if(n != name(i))
			throw invalid_value_exception("enum value name doesn't match", n);

		if(tmp != value(i))
			throw invalid_value_exception("enum value doesn't match", tmp);
	}
}
///////////////////////////////////////////////////////////////////////////////////////////////////

void Enum::saveState(boostext::iostreams::bin_ostream& stream) const
{
	stream << id();
	stream << name().toUtf8();
	stream << valueCount();
	for(int i = 0; i < valueCount(); ++i)
	{
		stream << name(i).toUtf8();
		stream << value(i);
	}
}
///////////////////////////////////////////////////////////////////////////////////////////////////
